import { Injectable, ExecutionContext, UnauthorizedException } from '@nestjs/common';
import { AuthGuard } from '@nestjs/passport';
import { Reflector } from '@nestjs/core';
import { IS_PUBLIC_KEY } from '../decorators/public.decorator';

@Injectable()
export class JwtAuthGuard extends AuthGuard('jwt') {
  constructor(private reflector: Reflector) {
    super();
  }

  canActivate(context: ExecutionContext) {
    const isPublic = this.reflector.getAllAndOverride<boolean>(IS_PUBLIC_KEY, [
      context.getHandler(),
      context.getClass(),
    ]);

    if (isPublic) {
      return true;
    }

    const request = context.switchToHttp().getRequest();
    console.log('完整请求头:', request.headers);
    console.log('Authorization Header:', request.headers.authorization);
    
    return super.canActivate(context);
  }

  handleRequest(err: any, user: any, info: any) {
    console.log('JWT验证 - 错误:', err);
    console.log('JWT验证 - 用户信息:', user);
    console.log('JWT验证 - 额外信息:', info);

    // 如果有错误但用户信息存在，可能是非致命错误，我们可以忽略它
    if (err && user) {
      console.warn('JWT验证有错误但用户信息存在，忽略错误:', err);
      return user;
    }

    if (err || !user) {
      throw err || new UnauthorizedException('Token验证失败: ' + (info?.message || '未知错误'));
    }
    
    // 确保用户对象有有效的 id
    if (!user.id && user.sub) {
      console.warn('JWT验证 - 用户ID不存在，使用sub作为ID');
      user.id = user.sub;
    }
    
    // 确保用户对象有有效的 username
    if (!user.username) {
      console.warn('JWT验证 - 用户名为空，尝试修复');
      // 这里不能直接查询数据库，因为这是一个同步方法
      // 我们可以设置一个默认值
      user.username = user.phone || `user_${user.id}`;
    }
    
    return user;
  }
}

